package com.audaque.springboot.foshanupload.web.springsecuritycas.component;

import lombok.extern.slf4j.Slf4j;
import org.springframework.security.access.ConfigAttribute;
import org.springframework.security.access.SecurityConfig;
import org.springframework.security.web.FilterInvocation;
import org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource;
import org.springframework.stereotype.Component;
import org.springframework.util.AntPathMatcher;

import java.util.Collection;

/**
 * 过滤器调用安全元数据源：默认的实现类 DefaultFilterInvocationSecurityMetadataSource，该类的主要功能就是通过当前的请求地址，获取该地址需要的用户角色。
 * 自定义的AuthorizeSecurityMetadataSource实现了FilterInvocationSecurityMetadataSource的getAttributes()方法，可以根据url获取对应的角色列表
 * 为鉴权提供基础资料：根据访问的路径判断出所需的角色
 * 菜单需要的权限：包括角色名称和后端权限表达式
 */

@Component
@Slf4j
public class MyFilterInvocationSecurityMetadataSource implements FilterInvocationSecurityMetadataSource {

    //路径匹配
    private AntPathMatcher antPathMatcher = new AntPathMatcher();

/*
    @Autowired
    private MenuService menuService;

*/

    @Override
    public Collection<ConfigAttribute> getAttributes(Object o) throws IllegalArgumentException {
        // 获取请求的Url
        String requestUrl = ((FilterInvocation) o).getRequestUrl();
/*
        //菜单需要的权限：包括角色名称和后端权限表达式
        List<Menu> menuWithRoles = menuService.getMenuWithRoles();
        for (Menu menu : menuWithRoles) {
            //访问的路径是否跟菜单的里的路径相同
            if (antPathMatcher.match(menu.getUrl(), requestUrl)) {

                String[] roles = menu.getRoleList().stream().map(Role::getRoleName).toArray(String[]::new);
                log.debug("需要的权限为{}", roles);
                System.out.println(roles);
                return SecurityConfig.createList(roles);
            }
        }
*/
        //添加意为”匿名访问“的角色。
        return SecurityConfig.createList("ROLE_ANONYMOUS");
    }

    @Override
    public Collection<ConfigAttribute> getAllConfigAttributes() {
        return null;
    }

    @Override
    public boolean supports(Class<?> aClass) {
        return false;
    }
}

